#!/bin/sh
umask 022

######################LAB############################LAB######################LAB############################
#
# 示例：
# 启动
# ./springboot.sh start app.jar qa 8080
# 停止
# ./springboot.sh stop app.jar qa 8080
# 重启
# ./springboot.sh restart app.jar qa 8080

# 脚本所在目录结构
# backup: 备份jar
# tmp: 构建时发送过来的jar
# logs: 项目日志
# xxx.jar 正在运行中的jar
# springboot.sh 当前脚本
######################LAB############################LAB######################LAB############################

######################LAB############################
# 环境变量及系统参数
######################LAB############################
NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
LANG="zh_CN.UTF-8"
export NLS_LANG LANG

# 脚本所在目录
WORK_HOME=$(cd $(dirname $0) && pwd )

# 运行jar包名
APP_NAME=$2
# 运行环境
APP_ENV=$3
# debug 端口
DEBUG_PORT=$4
# jar名称，去掉最后一个/左边的内容
APP_HOME=${APP_NAME##*/}
# jar名称，去掉 .jar
APP_HOME=${APP_HOME%.*}

PID=0
LOG=""

echo "=====================================LAB==========================================="
echo "运行目录:${WORK_HOME}"
echo "运行参数:$1 $2 $3 $4"
echo "运行项目:${APP_NAME}"
echo "项目目录:${APP_HOME}"

JAVA_MEM_OPTIONS="-server -Xms2G -Xmx2G -Xmn256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70"
JAVA_GC_OPTIONS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbose:gc -Xloggc:logs/$APP_HOME/gc.log"
JAVA_OPTIONS="${JAVA_MEM_OPTIONS} ${JAVA_GC_OPTIONS} -Dfile.encoding=UTF-8"

if [ ! -d $WORK_HOME/backup ];then
   mkdir $WORK_HOME/backup
fi
if [ ! -d $WORK_HOME/tmp ];then
   mkdir $WORK_HOME/tmp
fi
if [ ! -d $WORK_HOME/logs ];then
   mkdir $WORK_HOME/logs
fi
if [ ! -d $WORK_HOME/logs/$APP_HOME ];then
  mkdir $WORK_HOME/logs/$APP_HOME
fi
######################LAB############################
# 使用提示
######################LAB############################
usage() {
  echo "Usage: ./springboot.sh [start|stop|restart|status|deploy] [appName] [evn] [debug]"
  exit 1
}

######################LAB############################
# 获取进程ID
######################LAB############################
is_exist() {
  PID=`ps -ef|grep java|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1，存在返回0
  if [ -z "${PID}" ]; then
     echo "${APP_NAME} 还未运行！"
    return 1
  else
    echo "${APP_NAME} 正在运行中! (PID=${PID})"
    return 0
  fi
}

######################LAB############################
# 启动
######################LAB############################
start() {
   is_exist
   if [ -z "${PID}"  ]; then
     if [ ! "${DEBUG_PORT}" = "" ]; then
       JAVA_OPTIONS="${JAVA_OPTIONS} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${DEBUG_PORT}"
     fi
     cat /dev/null > ${WORK_HOME}/logs/${APP_HOME}.log
     nohup java $JAVA_OPTIONS -jar ${WORK_HOME}/${APP_NAME} --spring.profiles.active=$APP_ENV --logging.file.path=logs --lab.home=$WORK_HOME > ${WORK_HOME}/logs/${APP_HOME}.log 2>&1 &
     printf "启动中."
     for index in `seq 0 1 100`;do
       sleep 1
       LOG=`find ${WORK_HOME}/logs/${APP_HOME}.log |xargs grep -ri "JVM running for "`
       if [ -z "${LOG}" ]; then
         LOG=`find ${WORK_HOME}/logs/${APP_HOME}.log |xargs grep -ri "Application run failed"`
         if [ -z "${LOG}" ]; then
           printf "."
         else
           printf "失败!"
           break
         fi
       else
         printf "成功!"
         break
      fi
     done
     echo ""
     is_exist
   fi
}

######################LAB############################
# 检查应用是否启动成功
######################LAB############################
status(){
  is_exist
}

######################LAB############################
# 停止
######################LAB############################
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "停止 ${APP_NAME} ${PID}"
    kill -9 $PID
  fi
  is_exist
}

######################LAB############################
# 部署
######################LAB############################
deploy(){
	is_exist
	if [ $? -eq "0" ]; then
		stop
		sleep 2
	fi
	if [ -f $WORK_HOME/$APP_NAME ]; then
	  # 备份旧包到指定目录
    echo "备份 ${APP_NAME}"
    mv $WORK_HOME/$APP_NAME $WORK_HOME/backup/$APP_NAME-`date +%Y%m%d%-H%M%S`
	fi
  sleep 1
	#移动到新包到启动目录
	mv $WORK_HOME/tmp/$APP_NAME $WORK_HOME
	sleep 1
	start
}

######################LAB############################
# 读取脚本的第一个参数($1)进行判断
# 参数取值范围：{start|stop|restart|status}
# 如参数不在指定范围之内，则打印帮助信息
######################LAB############################
case "$1" in
  'start')
    start
    echo "=====================================LAB==========================================="
    ;;
 'stop')
    stop
    echo "=====================================LAB==========================================="
    ;;
 'restart')
    stop
    start
    echo "=====================================LAB==========================================="
    ;;
 'status')
    status
    echo "=====================================LAB==========================================="
    ;;
 "deploy")
  	deploy
  	echo "=====================================LAB==========================================="
  	;;
  *)
    usage
    echo "=====================================LAB==========================================="
    ;;
esac
